• ICS 2023 Midterm

    By WalkerCH
    13 元培数科 常欣海
    (具有部分GPT生成内容,请注意自我甄别)

    第 1 题

    类型转换

    Clip_2024-10-30_15-52-22

    第 2 题

    Symbol

    image-20241030155915484

    公式

    数值

    1. Two's Complement Minimal Value (Tmin)

    2. Two's Complement Maximal Value (Tmax)

    3. Unsigned Integer Maximal Value (Umax)

    4. IEEE 754 Floating-Point Representations

    4.1 Single Precision (float)
    4.2 Double Precision (double)

    第 3 题

    特殊值

    V=(1)s×2E×M
    :Bisa=2k11E=eBias

    舍入与计算

    x+fy=Round(x+y)x×fy=Round(x+y)
    (1)s1M12E1×(1)s2M22E2=(1)sM2E

    image-20231103193505785

    Inf & NaN

    IEEE 754 浮点数标准中,浮点运算结果可以是无穷大(Infinity)或非数(NaN,Not a Number)。这取决于操作数的值、运算的类型以及溢出、非法操作等情况。

    1. 无穷大(Infinity)

    什么时候出现无穷大?

    无穷大在运算结果超出浮点数的表示范围(即溢出)时出现。无穷大的符号可以是正的或负的,具体取决于运算的符号。

    具体情况
    1. 溢出

      • 当运算结果超过浮点数的最大可表示值时,会被设为无穷大。

      • 例如:

        • 1×10308×10(对于双精度)将导致正无穷大(+Inf)。

        • 1×10308×10(对于双精度)将导致负无穷大(-Inf)。

    2. 除以 0

      • 当非零数除以 0 时,结果是无穷大:

        • 1/0=+

        • 1/0=

      • 注意:0 除以 0 并不属于这一情况,而是会得到 NaN(见下文)。

    3. 无穷大的运算

      • 无穷大加/减非无穷大的有限数

        • ++x=+,其中 x 是有限数。

        • x=,其中 x 是有限数。

      • 无穷大乘以非零有限数

        • +×x=+(如果 x > 0),或 (如果 x < 0)。

        • ×x=(如果 x > 0),或 +(如果 x < 0)。

    4. 指数运算

      • 当浮点数的指数超出最大可表示的指数范围时,结果为无穷大。

    特殊运算例外

    2. 非数(NaN, Not a Number)

    什么时候出现 NaN?

    NaN 是在运算结果无意义或未定义的情况下出现的。它表示无法确定或非法的计算结果。

    具体情况
    1. 0 除以 0

      • 0/0 是未定义的,因此结果为 NaN

    2. 无穷大减无穷大

      • ++=NaN

      • =NaN

    3. 无穷大乘以 0

      • +×0=NaN

      • ×0=NaN

    4. 无穷大除以无穷大

      • /=NaN

    5. 浮点数的平方根

      • 对负数进行平方根运算,如 1,结果为 NaN

    6. 非法操作

      • 例如,尝试将无效的比特模式转换为浮点数时,也会得到 NaN

    7. 无效的类型转换

      • 如果尝试将浮点数的无效位模式(如非规范化的位模式)进行转换,可能会导致 NaN

    NaN 的特殊性质

    1. NaN 与 NaN 的比较

      • 在 IEEE 754 标准中,NaN 与任何数(包括 NaN 本身)的比较结果都是

      • 例如:

        • NaN==NaN

        • NaN<NaN

        • NaN>NaN

    2. 两种类型的 NaN

      • QNaN(Quiet NaN):用于传播计算中的错误,不引发异常。

      • SNaN(Signaling NaN):用于引发异常,提示需要特殊处理。

    IEEE 754 浮点运算规则总结

    运算类型结果为无穷大(Infinity)结果为 NaN
    溢出超出表示范围的结果-
    除以 0非零数除以 00 除以 0
    无穷大运算无穷大加/减有限数无穷大减无穷大
    无穷大乘法无穷大乘以非零有限数无穷大乘以 0
    无穷大除法非零有限数除以无穷大无穷大除以无穷大
    平方根-负数的平方根
    类型转换-非规范化位模式转换为浮点数

    总结

    第 4 题

    寄存器

    image-20231027155449720

    image-20231027155545061

    第 5 题

    寻址模式

    Imm(rb,ri,s)Imm+R[rb]+R[ri]s

    image-20231027160303412

    第 6 题

    条件码寄存器

    image-20231027163948649

    cmp & test

    image-20231027164019056

    set

    image-20231027164824830

    jmp

    image-20231027165129820

    第 7 题

    image-20231027153353079

    第 8 题

    指针运算

    指针相关

    基本指针运算

    image-20231027231852385

    Clip_2024-10-30_16-16-10

    PixPin_2024-10-30_01-25-18

    第 9 题


    解码复杂表达式

    Clip_2024-10-30_16-14-50

    Clip_2024-10-30_16-15-32

    指针运算

    Clip_2024-10-30_16-16-10

    第 10 题

    第 11 题

    第 12 题

    第 13 题

    Clip_2024-10-30_16-19-05

    Clip_2024-10-30_16-19-18

    第 14 题

    第 15 题

    解析第 15 题

    题目描述

    给定的 C 代码如下:

    需要分析该代码的输出。

    代码分析

    1. 字符数组初始化

      • s 是一个大小为 16 的字符数组。

      • 字符串 "I love ICS2023!" 的长度是 15 字节,加上一个终止符 '\0',刚好占用 16 字节的空间。

      • 在大端法存储的机器上,字符数组的存储顺序与字符串的书写顺序一致。

    2. 循环结构

      • sizeof(s) 返回的是 s 的大小,即 16。

      • sizeof(char) 为 1。

      • 因此,循环的初始条件是 i = 16,并且 i 每次减少 1。

    3. 隐式类型转换

      • 关键在于:sizeof 返回的是一个 unsigned 类型(在大多数编译器中是 unsigned long)。

      • 变量 i 是一个 int 类型,表达式 i - sizeof(char) 中,sizeof(char) 被视为无符号数,可能会导致隐式转换

      • i 递减到 0 时,i - sizeof(char) 变为 -1,由于 sizeof(char) 是无符号类型,这会被解释为一个大的无符号数(具体为 (2^{32} - 1)(2^{64} - 1),取决于编译器)。

      • 由于是无符号数的比较,i - sizeof(char) >= 0始终为真,导致循环无法停止

    4. 循环越界

      • i 小于 0 时,s[i - 1] 将访问到数组 s 的越界位置。

      • 这会导致字符数组越界访问,可能导致未定义行为,包括潜在的程序崩溃。

    最终结论

    常见的函数返回值类型

    1. sizeof 操作符

      • 返回类型size_t,是一个无符号整数类型

      • 出处stddef.h 头文件。

      • 解释size_t 用于表示对象或类型的大小,因此它是无符号的,以避免负值的表示问题。

      • 机制原因:返回无符号类型是因为对象的大小不可能为负数,这确保了类型的非负特性。

    2. strlen 函数

      • 返回类型size_t

      • 出处string.h 头文件。

      • 解释:返回字符串的长度(不包括末尾的 '\0')。

      • 机制原因:类似于 sizeofstrlen 返回的也是无符号值,因为字符串的长度只能是非负数。

    3. malloc 函数

      • 返回类型void *

      • 出处stdlib.h 头文件。

      • 解释:返回分配的内存块的指针。

      • 机制原因void * 类型可以被转换为任何其他指针类型,从而实现灵活的内存管理。

    4. strcmp 函数

      • 返回类型int

      • 出处string.h 头文件。

      • 解释:比较两个字符串,返回一个整数:

        • 负数:第一个字符串小于第二个。

        • 0:两个字符串相等。

        • 正数:第一个字符串大于第二个。

      • 机制原因:返回整数是为了能够描述字符串大小关系。

    常见的隐式类型转换规则

    1. 整数提升(Integer Promotion)

    2. 无符号与有符号的混合运算

    3. 算术转换(Arithmetic Conversions)

    4. 浮点数与整数的混合运算

    5. 赋值转换(Assignment Conversions)

    6. 函数参数转换(Function Argument Conversions)

    7. 指针类型转换

    8. 浮点类型的转换

    总结

    转换类型机制原因解释示例
    整数提升统一运算规则,避免溢出小于 int 的类型提升为 intchar x = 1; x + 1 转换为 int
    无符号与有符号的混合运算优先无符号类型范围更大有符号转换为无符号int a = -1; unsigned b = 2; a < b 结果为 False
    算术转换优先精度较高的类型提升为高精度类型int + float 转换为 float
    浮点数与整数的混合运算保持浮点运算的精度整数转换为浮点数int a = 5; float b = 2.5; a + b 转换为 float
    赋值转换保持变量类型的一致性右值转换为左值类型float f = 3.14; int i = f;
    函数参数转换确保函数参数匹配参数类型转换void func(int a); func(3.14);
    指针类型转换确保类型兼容性指针类型转换通过 void * 实现无损转换int *p; void *q = p;
    浮点类型的转换保持精度doublefloat 可能丢失精度,但不溢出double d = 3.14; float f = d;

    这些转换规则和机制源于 C/C++ 语言标准(如 C11 和 C++11 标准),它们确保了类型在运算和赋值中的一致性与安全性。

     

    第 16 题

    SEQ阶段实现

    取指阶段

    image-20231027150343819

     

    译码与写回阶段

    image-20231027150440385

    执行阶段

    image-20231027150511657

    访存阶段

    image-20231027150530593

     

    更新PC

    image-20231027150546442

    PIPE阶段实现

    image-20231104142630934

    PC选择和取指阶段

    image-20231028165003315

    译码和写回阶段

    image-20231028165037596

    执行阶段

    image-20231028165051875

    访存阶段

    image-20231028165104144

    控制逻辑

    image-20231028172103735

    image-20231025022406160

    image-20231025022428424

     

    第 17 题

    Clip_2024-10-30_16-28-26

    Clip_2024-10-30_16-27-52

    第 18 题

    磁盘相关计算

    Capacity=# bytessector×average # sectorstrack×# trackssurface×# surfacesplatter×# plattersdisk
    Taccess=Tavg seek+Tavg rotation+Tavg transfer
    Tavg transfer=1RPM×(1average # sectors/track)×(60 secs1 min)
    Tmax rotation=1RPM×(60 secs1 min)
    Tavg rotation=12×Tmax rotation
    DRAM & SRAM:K=210,M=220,G=230,T=240
    Disk & network:K=103,M=106,G=109,T=1012

     

    第 19 题

    给定的 Cache 参数

    地址的分解

    由于是 12 位地址,我们需要将其分解成 标记位(Tag)组索引(Index)块内偏移(Offset)

    1. 块内偏移b = 4 位,即最低的 4 位表示块内偏移。

    2. 组索引S = 4,即组数为 4,所以需要 log2(4)=2 位来表示组索引。

    3. 标记位:剩下的位数用于表示标记。

    因此,地址的分解如下:

    访问地址的分析

    按顺序分析每个访问地址的分解及 Cache 行为。

    1. 访问地址:4
    2. 访问地址:14
    3. 访问地址:84
    4. 访问地址:114
    5. 访问地址:514
    6. 访问地址:124
    7. 访问地址:84
    8. 访问地址:4

    最终结果

    总命中次数为 3 次(分别是地址 124、第二个 84 的访问命中)。

    正确答案是 D. 3

     

     

    第 20 题

    CPE

    Clip_2024-10-30_13-51-21

    数据流图+关键路径

    Clip_2024-10-30_13-51-48

    Clip_2024-10-30_13-52-02

    提高并行度

    局限性

    浮点运算

    image-20231103193505785

    第 二 题

    IEEE表示

    V=(1)s×2E×M

    image-20231103192109561

    image-20231103192133283

    特殊值

    V=(1)s×2E×M
    :Bisa=2k11E=eBias

    第 三 题

    栈与数据传送

    Clip_2024-10-30_16-34-46

    Clip_2024-10-30_16-34-13

    第 四 题

    SEQ阶段实现

    取指阶段

    image-20231027150343819

     

    译码与写回阶段

    image-20231027150440385

    执行阶段

    image-20231027150511657

    访存阶段

    image-20231027150530593

     

    更新PC

    image-20231027150546442

    PIPE阶段实现

    image-20231104142630934

    PC选择和取指阶段

    image-20231028165003315

    译码和写回阶段

    image-20231028165037596

    执行阶段

    image-20231028165051875

    访存阶段

    image-20231028165104144

    控制逻辑

    image-20231028172103735

    image-20231025022406160

    image-20231025022428424

    第 五 题

    Clip_2024-10-30_16-37-57

    Clip_2024-10-30_16-38-48

    Clip_2024-10-30_16-38-59

    题目回顾

    地址划分

    地址序列模拟

    地址序列为:5、10、15、6、11、4、13

    初始缓存状态

    模拟过程

    1. 访问地址 5

      • 二进制:0101

        • Tag:0

        • Set10

        • 偏移:1

      • 结果:Set 2 不命中,缓存块替换为 M[4-5]

      • 缓存状态更新为:

    2. 访问地址 10

      • 二进制:1010

        • Tag:1

        • Set01

        • 偏移:0

      • 结果:Set 1 不命中,缓存块替换为 M[10-11]

      • 缓存状态更新为:

    3. 访问地址 15

      • 二进制:1111

        • Tag:1

        • Set11

        • 偏移:1

      • 结果:Set 3 不命中,缓存块替换为 M[14-15]

      • 缓存状态更新为:

    4. 访问地址 6

      • 二进制:0110

        • Tag:0

        • Set11

        • 偏移:0

      • 结果:Set 3 不命中,缓存块替换为 M[6-7]

      • 缓存状态更新为:

    5. 访问地址 11

      • 二进制:1011

        • Tag:1

        • Set01

        • 偏移:1

      • 结果:Set 1 命中,因为缓存块为 M[10-11],Tag 也匹配。

      • 缓存状态保持不变:

    6. 访问地址 4

      • 二进制:0100

        • Tag:0

        • Set10

        • 偏移:0

      • 结果:Set 2 命中,因为缓存块为 M[4-5],Tag 也匹配。

      • 缓存状态保持不变:

    7. 访问地址 13

      • 二进制:1101

        • Tag:1

        • Set10

        • 偏移:1

      • 结果:Set 2 不命中,缓存块替换为 M[12-13]

      • 缓存状态更新为:

    最终缓存状态

    命中和未命中次数

    总结答案

    1. 最终缓存状态

    2. 命中次数:2 次

    3. 未命中次数:5 次